#include<iostream>
#include<unistd.h>
#include<stdlib.h>
using namespace std;
void TestFork()

{
    int a = 0;
    int flag = 0;
while(1)//没有访问外设，进程在运行状态 STAT R+ +的意思是前台运行程序，可终止程序
    //运行状态并不意味这程序一定在运行中，他表明进程要么实在运行中要么在运行队列里
    {
        a = 1+1;
        flag++;
        cout <<"a的值是："<<a<<"runing flag:"<<flag<<endl;//因为在访问外设，所以99%的时间都在等待，1%是运行状态
        //S状态就是sleeping阻塞状态,就是浅度睡眠，可以被终止
        //D状态，深度睡眠，该状态下，无法别OS杀掉，只能通过断电，或者进程自己醒来，防止数据丢失
        //kill -19 T状态暂停代码，其实就是阻塞状态的一种
        //kill -18 R状态，没+号
        //kill -9 杀掉进程
        //t状态该进程被追踪，如果用gdb调试程序，gdb程序是阻塞状态
        //Z状态：僵尸进程，当一个进程退出的时候，不能立刻释放该进程对应的资源！保留一段时间，让父进程或者OS来进行读取！
        //只要保证进程退出了，但是没有被回收(父进程、OS)->创建子进程，让父进程不要退出，而且什么都不知，让子进程正常退出！就可以观察到Z状态。
        //task:工作，进程的意思
    }
    }

void TestFork1()
{

    pid_t id = fork();
    if(id == 0)
    {
        while(id == 0)
        {
            //子进程
            cout << "我是一个子进程！pid=" << getpid() << "ppid=" << getppid() << endl;

            sleep(1);
           //sleep(5);
            //exit(1);//休眠5秒后退出，父进程不回收子进程
            //孤儿进程:父进程先退出
            //1.这种现象一定存在
            //2.子进程会被1号进程领养。OS
            //3.如果不领养，子进程退出，对应的僵尸，就没有人能回收了
            //4.如果是前台进程创建的子进程，如果孤儿了，会自动变成后台进程
        }
    }
    if(id > 0)
    {
        while(1)
        {
            //父进程
            cout << "我是一个父进程！pid=" << getpid() << "ppid=" << getppid() << endl;
            sleep(1);
        }
    }  
}
int main()
{
   // TestFork();
    TestFork1();
    return 0;
}


